package com.mandao.concurrency.example.singleton;

import com.mandao.concurrency.annotations.ThreadSafe;

/**
 *  懒汉式  双重锁机制
 */
@ThreadSafe
public class SingletonExample5 {
    private SingletonExample5(){}

    /*
     单例对象  使用volatile + 双重锁机制 禁止指令重排
     */
    private volatile static SingletonExample5 instance = null;

    /**
     *
     *  cpu的工作流程
     *    1  memory = allocate() 分配对象的内存空间
     *    2  ctorInstance() 初始化对象
     *    3  instance =  memory 设置instance指向刚分配的内存空间
     *
     *   使用 volatile
     */
    public static SingletonExample5 getInstance(){
        if (null == instance){
            synchronized (SingletonExample5.class){
                if (null == instance){
                    instance = new SingletonExample5();
                }
            }
        }
        return instance;
    }
}
